/*************************************************************************************
 *
 *	模块名称 : 词典模块
 *	文件名称 : dict.c
 *	版   本 : V1.0
 *	说   明 : 根据用户输入单词查找词典并打印单词类型和释义。
 *	修改记录 :
 *		     版本号       日期         作者        说明
 *	         V1.0     2022-05-12      YT        发布
 *
 *	Copyright (C), 2022-2030, xxxx
 *
 *************************************************************************************/

#include "../inc/inc.h"
#include "../inc/dict.h"

static FILE *gs_fpDict = NULL;  //定义词典文件流指针为全局静态变量


int dictOpen()
{
    if( NULL == ( gs_fpDict = fopen(DICT_FILE_NAME, "r") ) )
    {
        perror("Fail dictInit");
        return -1;
    }

    return 0;

}


int dictClose()
{
    if ( fclose(gs_fpDict) != 0 )
    {
        perror("Fail dictClose");
        return -1;
    }
    return 0;

}


int dictIsExitWord(const char strWord[])
{
    return strcmp( strWord, STR_EXIT );
}


int dictFindWord(const char strUsrWord[], WordFormatTypedef * pFmtWord )
{
    char strDictWordLine[MAX_WORD_STR_SIZE] = {0};  //定义字符数组，保存从词典中读取的每行数据
    char *pDict = NULL;

    memset( pFmtWord, 0, sizeof(WordFormatTypedef) ); //清空单词结构体

    //循环按行读取词典数据，若是确定为有效单词，则拆分赋值到单词结构体并直接退出函数
    while ( NULL != fgets( strDictWordLine, MAX_WORD_STR_SIZE, gs_fpDict ) )
    {
        
        pDict = strtok( strDictWordLine, " " );             //获取词典单词字段
        if( strcmp( strUsrWord, pDict ) == 0 )              //字典单词字段与用户输入相同,找到单词
        {
            strcpy( pFmtWord->Word, pDict );                //将字典单词字段存入目标单词结构体Word
            
            if ( NULL != ( pDict = strtok(NULL, " ") ) )    //获取到合法的词典类型字Type
            {
                strcpy( pFmtWord->Type, pDict );            //将字典类型字段存入目标单词结构体
            }
 
            if ( NULL != ( pDict = strtok(NULL , "\n") ) )   //获取到合法的字典解释字段
            {
                strcpy( pFmtWord->Expln, pDict );            //将词典解释字段存入目标单词结构体
            }

            rewind( gs_fpDict );
            return 0;
        }
    }
    
    rewind( gs_fpDict );
    return -1;
}


int dictPrintWord( const WordFormatTypedef *pFmtWord )
{
    if ( pFmtWord->Word[0] != 0 )  //正常单词结构体
    {
        printf( "Word   : %s\nType   : %s\nExplain: %s\n======================================\n",
            pFmtWord->Word, pFmtWord->Type, pFmtWord->Expln );
        return 0;
    }
    else                           //空单词结构体
    {
        printf( "***Empty Word in Dict***\n======================================\n" ); 
        return -1;
    }
}


